// `match` 需要覆盖全部情况
#[test]
fn test_match() {
    let number = 13;
    // TODO ^ 尝试为 `number` 赋不同的值

    println!("告诉我关于 {} 的信息", number);
    match number {
        // 匹配单个值
        1 => println!("一！"),
        // 匹配多个值
        2 | 3 | 5 | 7 | 11 | 13=> println!("这是个质数"),
        // TODO ^ 尝试将 13 添加到质数列表中
        // 匹配一个闭区间范围
        13..=19 => println!("一个青少年"),
        // 处理其余情况
        _ => println!("没什么特别的"),
        // TODO ^ 尝试注释掉这个匹配所有情况的分支
    }

    let boolean = true;
    // match 也是一个表达式
    let binary = match boolean {
        // match 的分支必须覆盖所有可能的值
        false => 0,
        true => 1,
        // TODO ^ 尝试注释掉其中一个分支
    };

    println!("{} -> {}", boolean, binary);
}

// 使用 `allow` 来抑制警告，因为只使用了一个变体。
#[allow(dead_code)]
enum Color {
    // 这 3 个仅通过名称指定。
    Red,
    Blue,
    Green,
    // 这些同样将 `u32` 元组与不同的名称（颜色模型）关联。
    RGB(u32, u32, u32),
    HSV(u32, u32, u32),
    HSL(u32, u32, u32),
    CMY(u32, u32, u32),
    CMYK(u32, u32, u32, u32),
}

#[test]
fn test_match02(){
    let color = Color::RGB(122, 17, 40);
    // TODO ^ 尝试为 `color` 使用不同的变体

    println!("这是什么颜色？");
    // 可以使用 `match` 来解构 `enum`。
    match color {
        Color::Red   => println!("颜色是红色！"),
        Color::Blue  => println!("颜色是蓝色！"),
        Color::Green => println!("颜色是绿色！"),
        Color::RGB(r, g, b) =>
            println!("红：{}，绿：{}，蓝：{}！", r, g, b),
        Color::HSV(h, s, v) =>
            println!("色相：{}，饱和度：{}，明度：{}！", h, s, v),
        Color::HSL(h, s, l) =>
            println!("色相：{}，饱和度：{}，亮度：{}！", h, s, l),
        Color::CMY(c, m, y) =>
            println!("青：{}，品红：{}，黄：{}！", c, m, y),
        Color::CMYK(c, m, y, k) =>
            println!("青：{}，品红：{}，黄：{}，黑（K）：{}！",
                     c, m, y, k),
        // 不需要其他分支，因为所有变体都已检查
    }
}

// 守卫
// match 分支可以使用守卫进行额外的筛选。
#[allow(dead_code)]
enum Temperature {
    Celsius(i32),
    Fahrenheit(i32),
}

#[test]
fn test_match03() {
    let temperature = Temperature::Celsius(35);
    // ^ TODO：尝试为 `temperature` 赋予不同的值

    // 注意，编译器在检查 match 表达式是否涵盖了所有模式时，不会考虑守卫条件。
    match temperature {
        Temperature::Celsius(t) if t > 30 => println!("{}°C 高于 30°C", t),
        // `if condition` 部分 ^ 就是守卫
        Temperature::Celsius(t) => println!("{}°C 不高于 30°C", t),

        Temperature::Fahrenheit(t) if t > 86 => println!("{}°F 高于 86°F", t),
        Temperature::Fahrenheit(t) => println!("{}°F 不高于 86°F", t),
    }
}